package com.regent.central.bill.service.mrp;

import com.regent.central.bill.core.mrp.BillMaterialArrive;
import com.regent.central.bill.repository.mrp.dto.BillMaterialArriveAddDTO;
import com.regent.central.bill.repository.mrp.dto.MaterialArriveDTO;
import com.regent.central.bill.repository.mrp.dto.arrive.*;
import com.regent.central.bill.service.mrp.exception.MrpServiceException;
import com.regent.central.infrastructure.service.DomainService;

import java.util.List;

public interface BillMaterialArriveService extends DomainService<BillMaterialArrive> {

    BillMaterialArriveCreateResult create(BillMaterialArriveAddDTO billMaterialArriveAddDTO);


    /**
     * 封装产品给的生成到料单号的逻辑并返回生成的单号
     *
     * @param unitId 组织ID
     * @return 单号
     */
    String getOrderNumber(String unitId);

    /**
     * 查询到料单详情
     *
     * @param billMaterialArriveId 到料单ID
     * @return 到料单详情
     */
    BillMaterialArriveDetailDTO detail(String billMaterialArriveId);

    /**
     *
     * 查询组织层的到料单号
     * @param unitId
     * @return
     */
    List<String> findOrderNosByUnitId(String unitId);

    /**
     * 做验布和缩布前的查询
     *
     * @param billMaterialArriveId 到料单ID
     */
    List<MaterialSkuCSDTO> csMaterialSku(String billMaterialArriveId);

    /**
     * 验布
     */
    void check(ArriveCheckDTO arriveCheckDTO) throws MrpServiceException;

    /**
     * 缩布
     */
    List<ArriveShrunkStockChangeResult> shrunk(ArriveShrunkDTO arriveShrunkDTO) throws MrpServiceException;

    /**
     * 关联验布引起的库存变动记录
     */
    void checkStockChange(List<ArriveCheckShrunkStockChangeDTO> stockChanges);

    /**
     * 关联缩布引起的库存变动记录
     */
    void shrunkStockChange(List<ArriveCheckShrunkStockChangeDTO> stockChanges);

    /**
     * 撤销缩布
     */
    UndoCheckResult undoCheck(String billMaterialArriveId, String materialSkuId);

    /**
     * 撤销缩布
     */
    UndoShrunkResult undoShrunk(String billMaterialArriveId, String materialSkuId);

    /**
     * 到料分页列表查询
     *
     * @param billMaterialArriveQueryDTO
     * @return
     */
    BillMaterialArrivePageDTO listMaterialArrive(BillMaterialArriveQueryDTO billMaterialArriveQueryDTO, int pageNum, int pageSize);

    /**
     * 到料单导出Excel
     * @param billMaterialArriveQueryDTO
     * @return
     */
    List<MaterialArriveDTO> arriveExcel(BillMaterialArriveQueryDTO billMaterialArriveQueryDTO);

    BillArriveUndoResult undo(String billMaterialArriveId);

    /**
     * 关联库存变动记录
     *
     * @param billMaterialArriveId 到料单ID
     * @param stockChangeId        库存变动记录
     */
    void relationStockChange(String billMaterialArriveId, String stockChangeId);
}